package net.xo68.destiny.core.timingwheel;

import java.io.Serializable;

/**
 * 超时项接口
 * @author wuxie
 * @version 2020-10-18
 */
public interface Timeout<T> {

    /**
     * 是否超时
     * @return
     */
    boolean isExpired();

    /**
     * 是否取消
     * @return
     */
    boolean isCancelled();

    /**
     * 驱动过期处理
     */
    void expire();

    /**
     * 从时光轮格子对应的超时项桶中移除
     */
    void remove();

    /**
     * 取消
     * @return
     */
    boolean cancel();

    /**
     * 任务序列号
     * @return
     */
    String taskSequence();

    /**
     * 所在桶
     * @return
     */
    TimingWheelBucket<T> bucket();

    void bucket(TimingWheelBucket<T> bucket);

    /**
     * 原延迟时间，单位毫秒
     * @return
     */
    long sourceDeadline();

    /**
     * 修正后的延迟时间：triggerTime - startTime （触发时间-时光轮启动时间）
     * @return
     */
    long deadline();

    /**
     * 剩余的轮数
     * @return
     */
    long remainingRounds();

    void remainingRounds(long remainingRounds);

    /**
     * 剩余轮数减少1
     */
    void remainingRoundDecrement();

    /**
     * 触发参数
     * @return
     */
    T triggerParameter();

    /**
     * 状态
     * @return
     */
    int state();
}
